############################################################
# $Id: oracle.p,v 1.27 2006/05/17 16:33:33 misha Exp $
############################################################


@CLASS
oracle

@USE
sql.p

@BASE
sql



############################################################
@auto[]
$server_name[oracle]
#end @auto[]



############################################################
@init[sConnectString;hParam]
^BASE:init[$sConnectString;$hParam]
#end @init[]



###########################################################################
# in this this method we can set server enviroments
@setServerEnviroment[]
# set date/time format and language
^void:sql{ALTER SESSION SET NLS_LANGUAGE="ENGLISH"}
^void:sql{ALTER SESSION SET NLS_TERRITORY="AMERICA"}
^void:sql{ALTER SESSION SET NLS_DATE_FORMAT="YYYY-MM-DD HH24:MI:SS"}
$result[]
#end @setServerEnviroment[]



# DATE functions

############################################################
@today[]
$result[trunc(SYSDATE)]
#end @today[]



############################################################
@now[]
$result[SYSDATE]
#end @now[]



############################################################
@year[sSource]
$result[TO_CHAR($sSource,'YYYY')]
#end @year[]



############################################################
@month[sSource]
$result[TO_CHAR($sSource,'MM')]
#end @month[]



############################################################
@day[sSource]
$result[TO_CHAR($sSource,'DD')]
#end @day[]



############################################################
@ymd[sSource]
$result[TO_CHAR($sSource,'YYYY-MM-DD')]
#end @ymd[]



############################################################
@time[sSource]
$result[TO_CHAR($sSource,'HH24:MI:SS')]
#end @time[]



############################################################
@date_diff[t;sDateFrom;sDateTo]
$result[^if(def $sDateTo){TO_DATE($sDateTo)}{^self.today[]} - TO_DATE($sDateFrom)]
#end @date_diff[]



############################################################
@date_sub[sDate;iDays]
$result[^if(def $sDate){TO_DATE($sDate)}{^self.today[]} - $iDays]
#end @date_sub[]



############################################################
@date_add[sDate;iDays]
$result[^if(def $sDate){TO_DATE($sDate)}{^self.today[]} + $iDays]
#end @date_add[]



# functions available not for all sql servers
############################################################
# MSSQL havn't anything like this
@date_format[sSource;sFormatString]
$result[TO_CHAR($sSource, '^if(def $sFormatString){$sFormatString}{YYYY-MM-DD}')]
#end @date_format[]



# LAST_INSERT_ID()

# for auto increment we must for each table with name (TABLE) add
# CREATE SEQUENCE SEQ_TABLE INCREMENT by 1 START with 1;
# CREATE TRIGGER TRG_TABLE
# BEFORE INSERT ON TABLE
#     FOR EACH ROW
#     BEGIN
#     IF :new.TABLE_id is null THEN
#         SELECT SEQ_TABLE.nextval INTO :new.TABLE_id FROM dual;
#     END IF;
# END;
# /

############################################################
@last_insert_id[sTable]
^self._execute{
	$result(^int:sql{SELECT SEQ_${sTable}.currval FROM dual}[$.default{0}])
}
#end @last_insert_id[]



############################################################
@set_last_insert_id[sTable;sField]
^self._execute{
	$result(^self.last_insert_id[$sTable])
	^void:sql{UPDATE $sTable SET ^if(def $sField){$sField}{sort_order} = $result WHERE ${sTable}_id = $result}
}
#end @set_last_insert_id[]



# STRING functions

############################################################
@substring[sSource;iPos;iLength]
$result[SUBSTR($sSource,^if(def $iPos){$iPos}{1},^if(def $iLength){$iLength}{1})]
#end @substring[]



############################################################
@upper[sField]
$result[UPPER($sField)]
#end @upper[]



############################################################
@lower[sField]
$result[LOWER($sField)]
#end @lower[]



############################################################
@concat[sSource]
$result[CONCAT($sSource)]
#end @concat[]



# MISC functions

############################################################
@password[sPassword]
$result[$sPassword]
#end @password[]



############################################################
@left_join[sType;sTable;sJoinConditions;last]
^switch[^sType.lower[]]{
	^case[from]{
		$result[, $sTable]
	}
	^case[where]{
		$result[$sJoinConditions (+)^if(!def $last){ AND}]
	}
	^case[DEFAULT]{
		^throw[oracle.p;Unknown join type '$sType']
	}
}
#end @left_join[]


